#include <iostream>
#include <random>
#include <sstream>
#include <iomanip>
#include <atomic>

/**
 * 生成类UUID字符串（非标准UUID格式）
 * 格式: 8B-4B-2B-2B-6B+8B  (B=字节)
 * 前16字节是随机数，后8字节是递增序列号
 */
static std::string uuid() {
    // 使用硬件随机数生成器初始化随机数引擎
    static std::random_device rd;
    static std::mt19937_64 generator(rd());
    // 生成0-255之间的均匀分布随机数
    static std::uniform_int_distribution<int> distribution(0, 255);

    std::stringstream ss;
    
    // 生成16字节随机部分（标准UUID的随机部分为128位/16字节）
    for (int i = 0; i < 8; i++) {
        // 生成随机字节并格式化为两位十六进制字符串
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
        // 按照标准UUID格式插入分隔符
        if (i == 3 || i == 5 || i == 7) {
            ss << "-";
        }
    }

    // 生成8字节原子递增序列号（标准UUID不含此部分）
    static std::atomic<size_t> seq(1);
    size_t num = seq.fetch_add(1);
    
    // 将序列号转换为16进制字符串
    for (int i = 7; i >= 0; i--) {
        ss << std::setw(2) << std::setfill('0') << std::hex 
           << ((num >> (i * 8)) & 0xff);
        if (i == 6) ss << "-"; // 插入分隔符
    }
    
    return ss.str();
}

int main()
{
    // 测试生成20个UUID
    for (int i = 0; i < 20; i++) {
        std::cout << uuid() << std::endl;
    }
    
    return 0;
}